package kr.pe.johnkim.sendme.activity;

import org.json.JSONObject;

import kr.pe.johnkim.sendme.provider.SendMeLog;
import kr.pe.johnkim.sendme.provider.SendMeMember;
import kr.pe.johnkim.sendme.rest.SendMeLogRest;
import kr.pe.johnkim.sendme.rest.SendMeMemberRest;
import kr.pe.johnkim.sendme.util.SendMeActivityManager;
import kr.pe.johnkim.sendme.util.SendMeCommon;
import kr.pe.johnkim.sendme.util.SendMeConstant;
import android.app.Activity;
import android.app.ProgressDialog;
import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences;
import android.os.AsyncTask;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.util.Log;
import android.view.Gravity;
import android.view.View;
import android.view.Window;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ImageButton;
import android.widget.Toast;

public class SendMeSubSettingsProfileActivity extends Activity {

	public static String TAG = SendMeSubSettingsProfileActivity.class.getSimpleName();
	
	
	// 액티비티 매니저를 가져 온다.
	private SendMeActivityManager sendMeActivityManager = SendMeActivityManager.getInstance();
	
	ImageButton imageButtonTopBack;
	ImageButton imageButtonTopMainMenu;
	
	EditText profileNickNameTxt;

	Button confirmBtn;

	private ProgressDialog dialog;
	
	// 로그를 남긴다
	private static final int THREAD_REGISTER_LOG = 100;
	
	// 멤버 정보를 가져 와서 업데이트한다
	private static final int THREAD_SELECT_MEMBER_AND_UPDATE_MEMBER = 101;
	
	// 프로그레스 바를 출력 한다.
	private static final int THREAD_PROGRESS_BAR_VISIBLE = 106;
	
	// 프로그레스 바를 감춘다.
	private static final int THREAD_PROGRESS_BAR_INVISIBLE = 107;
	
	
	// 이미 사용중인 닉네임 toast 를 띄운다
	private static final int THREAD_ALREADY_EXIST_NICK_NAME = 110;
		
	// 정보 저장에 성공했다는 toast 를 띄운다.
	private static final int THREAD_SUCCESS_SAVE_INFO = 109;
	
	// 정보 저장에 실패했다는 dialog 를 띄운다.
	private static final int THREAD_FAIL_SAVE_INFO = 111;
	
	String profileUserName;
	
	// 사용자 휴대 전화번호.
	private String PHONE_NUMBER = "";
	
	/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
	
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		
		// 커스텀 타이블 바를 설정 한다.
		Window window = getWindow();
		window.requestFeature(Window.FEATURE_CUSTOM_TITLE);
				
		setContentView(R.layout.activity_send_me_sub_settings_profile);
		
		window.setFeatureInt(Window.FEATURE_CUSTOM_TITLE, R.layout.custom_title_bar_03);
		
		// 액티비티 매니저에 담는다.
		sendMeActivityManager.addActivity(this);
		
		// 설정파일을 가져 온다.
		this.selectPreferenceProfileData();
		
		
		// 뒤로 가기 화살표 버튼을 설정 한다.
				imageButtonTopBack = (ImageButton)findViewById(R.id.imageButtonTopBack);
				imageButtonTopBack.setOnClickListener(new View.OnClickListener() {

					@Override
					public void onClick(View v) {
						// TODO Auto-generated method stub

						Intent intent = new Intent(returnThis(), SendMeSettingsActivity.class);
						startActivity(intent);
						
						// 화면을 닫는다.
						sendMeActivityManager.removeActivity(SendMeSubSettingsProfileActivity.this);
						finish();
					}
				});

				// 타이틀바의 메인 메뉴 버튼을 설정 한다.
				imageButtonTopMainMenu = (ImageButton)findViewById(R.id.imageButtonTopMainMenu);
				imageButtonTopMainMenu.setOnClickListener(new OnClickListener() {

					@Override
					public void onClick(View v) {
						// TODO Auto-generated method stub
						Log.i(TAG, "pressed top main menu.");

						// 메인 메뉴 화면을 출력 한다.
						Intent i = new Intent(SendMeSubSettingsProfileActivity.this, SendMeMainMenuActivity.class);
						startActivity(i);
						
						// 화면을 닫는다.
						sendMeActivityManager.removeActivity(SendMeSubSettingsProfileActivity.this);
						finish();
					}
				});
				
				
		// 이름 입력창
		profileNickNameTxt = (EditText)findViewById(R.id.profile_nick_name_txt);
		profileNickNameTxt.setText(profileUserName);
		profileNickNameTxt.requestFocus();
		
		// 확인 버튼
		confirmBtn = (Button)findViewById(R.id.confirm_btn);
		confirmBtn.setOnClickListener(new OnClickListener() {
			@Override
			public void onClick(View v) {
				profileUserName = profileNickNameTxt.getText()+"";
				if(profileUserName.length()>0){
//					new backgroundThreadSaveProfileUserName().execute();	// ### 
					mHandler.sendMessage(mHandler.obtainMessage(THREAD_SELECT_MEMBER_AND_UPDATE_MEMBER));
				}else{
					// test 용  ### 원래는 사용 불가
					mHandler.sendMessage(mHandler.obtainMessage(THREAD_SELECT_MEMBER_AND_UPDATE_MEMBER));
				}
//				mHandler.sendMessage(mHandler.obtainMessage(THREAD_REQUEST_CERTIFICATION));
			}
			
		});
		
		
		// 로깅.
		mHandler.sendMessage(mHandler.obtainMessage(THREAD_REGISTER_LOG));
		
	}

//	@Override
//	public boolean onCreateOptionsMenu(Menu menu) {
//		// Inflate the menu; this adds items to the action bar if it is present.
//		getMenuInflater().inflate(R.menu.send_me_certification, menu);
//		return true;
//	}
	
	/**
	 * Handler 를 정의 한다.
	 * 모든 Thread 를 등록해 놓고 호출 한다.
	 */
	private Handler mHandler = new Handler() {
		@Override
		public void handleMessage(Message msg) {
			switch(msg.what) {
			
			// 로그를 남긴다
			case THREAD_REGISTER_LOG : 
				threadRegisterLog();
				break;
//			// 인증번호를 요청 한다.
//			case THREAD_REQUEST_CERTIFICATION : 
//				threadRequestCertification();
//				break;
//			// 승인을 요청 한다.
//			case THREAD_REQUEST_ADMISSION : 
//				threadRequestAdmission();
//				break;
				// 멤버 정보를 가져 와서 업데이트한다		
			case THREAD_SELECT_MEMBER_AND_UPDATE_MEMBER: 
				threadSelectMemberAndUpdateMember();
				break;
				
			// 프로그레스 바를 출력 한다.
			case THREAD_PROGRESS_BAR_VISIBLE : 
				if(dialog==null){
					dialog = ProgressDialog.show(SendMeSubSettingsProfileActivity.this, "", "Save..", true);
				}else{
					dialog.show();
				}
				break;
			// 프로그레스 바를 감춘다.
			case THREAD_PROGRESS_BAR_INVISIBLE : 
				dialog.dismiss();
				break;
//			// 뒤로가기 버튼을 터치하면 alert 창을 띄우고 앱을 종료 한다.
//			case ALERT_DIALOG_EXIT_ID : 
//				showDialogSystemExit();
//				break;
//			// SMS 로 인증번호를 발송하면 toast 를 띄운다.
//			case THREAD_SMS_SEND_CERTIFICATION : 
//				showToastSendSMS();
//				break;
				
				
				// 이미 사용중인 닉네임 toast 를 띄운다
			case THREAD_ALREADY_EXIST_NICK_NAME : 
				showToastAlreadyExistNickName();
				break;
			// 정보 저장에 성공했다는 toast 를 띄운다.
			case THREAD_SUCCESS_SAVE_INFO : 
				showToastSuccessSaveInfo();
				break;
			// 정보 저장에 실패했다는 dialog 를 띄운다.
			case THREAD_FAIL_SAVE_INFO : 
				showToastFailSaveInfo();
				break;
//			// 승인에 실패했다는 dialog 를 띄운다.
//			case THREAD_FAIL_TO_ADMISSION : 
//				showDialogFailToAdmission();
//				break;
//			// 받은 인증번호를 인증번호 입력란에 세팅 한다.
//			case THREAD_SET_CERTIFICATION_NUMBER : 
//				setCertificationNumber();
//				break;
//			// 전화번호부 목록을 서버로 전달한다
//			case THREAD_UPDATE_INSTALL : 
//				threadUpdateInstallAndFinish();
//				break;
			}
		}
	};
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
	
	/**
	 * backgroundThreadSaveProfileUserName
	 * 비동기  .  설정에 이름 저장 ### -> 사용 x
	 * @author blue
	 *
	 */
	public class backgroundThreadSaveProfileUserName extends AsyncTask<Void, Void, Void>{
		private ProgressDialog dialog;
		@Override protected void onPostExecute(Void result) {  
			dialog.dismiss();
		} 
		@Override protected void onPreExecute() {  
			dialog = ProgressDialog.show(SendMeSubSettingsProfileActivity.this, "", "Save..", true);
		} 
		@Override protected Void doInBackground(Void... params) {  
			Log.d(TAG,"backgroundThreadSaveProfileUserName");
			savePreferenceProfileData();
			return null; 
		}
	}
	
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
	// 서버 통신
	
	/**
	 * 멤버 정보를 가져 와서 업데이트한다
	 * 
	 */
	public void threadSelectMemberAndUpdateMember() {
		// 프로그레스 바를 출력 한다.
		mHandler.sendMessage(mHandler.obtainMessage(THREAD_PROGRESS_BAR_VISIBLE));
		
		Thread thread = new Thread(new Runnable() {

			public void run() {
				// TODO Auto-generated method stub

				SendMeCommon sendMeCommon = new SendMeCommon();
				String nowTime = sendMeCommon.getCurrentDate();
				
				/*
				 * 조회
				 */
				SendMeMember sendMeMember = new SendMeMember();
				sendMeMember.setPhoneNumber(PHONE_NUMBER);
				sendMeMember.setActivateYn("Y");
				
				SendMeMemberRest sendMeMemberRest = new SendMeMemberRest();
				
				SendMeMember result1 = sendMeMemberRest.selectMember(sendMeMember);
				Log.d(TAG,"result1.getNickName()::"+result1.getNickName());
				

				
				
				/*
				 * 중복검사
				 */
				result1.setPhoneNumber(PHONE_NUMBER);
				result1.setActivateYn("Y");
				result1.setNickName(profileUserName);
				
				SendMeMember result2 = sendMeMemberRest.selectDuplicationNickName(result1);
				if(result2.getTotalCount().equals("0")){
					/*
					 * 업데이트
					 */
					result1.setPhoneNumber(PHONE_NUMBER);
					result1.setActivateYn("Y");
					result1.setNickName(profileUserName);
					result1.setModifyDate(nowTime);
					
					SendMeMember result3 = sendMeMemberRest.updateMember(result1);
					
					// 결과 알림. 성공시 pref에도 저장 후 종료
					if(result3.getResult().equals("SUCCESS")){
						savePreferenceProfileData();
						mHandler.sendMessage(mHandler.obtainMessage(THREAD_SUCCESS_SAVE_INFO));
						finishActivity();
					}else{
						mHandler.sendMessage(mHandler.obtainMessage(THREAD_FAIL_SAVE_INFO));
					}
				}else{
					// toast(이미 사용중인 닉네임);
					mHandler.sendMessage(mHandler.obtainMessage(THREAD_ALREADY_EXIST_NICK_NAME));		
				}
				
				// 프로그레스 바를 감춘다.
				mHandler.sendMessage(mHandler.obtainMessage(THREAD_PROGRESS_BAR_INVISIBLE));
				
			}
		});
		thread.start();
	}
	
	
	
	
	/**
	 * 로그를 남긴다	 
	 */
	public void threadRegisterLog() {
		Thread thread = new Thread(new Runnable() {
			public void run() {
				
				SendMeCommon sendMeCommon = new SendMeCommon();
				String nowTime = sendMeCommon.getCurrentDate();
				
				SendMeLog sendMeLog = new SendMeLog();
				sendMeLog.setPhoneNumber(PHONE_NUMBER);
				sendMeLog.setViewName(TAG);
				sendMeLog.setRegisterDate(nowTime);
				
				SendMeLogRest sendMeLogRest = new SendMeLogRest();
				
				sendMeLogRest.registerLog(sendMeLog);
			}
		});
		thread.start();
	}
	
	
	/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
	// 닫기 관련
	
	public Context returnThis(){
		return this;
	}
	
	
	
	/*
	 * 종료한다
	 */
	public void finishActivity(){
		sendMeActivityManager.removeActivity(SendMeSubSettingsProfileActivity.this);
		finish();
	}
//	/**
//	 * 뒤로 가기 버튼을 정의 한다.
//	 * 설치단계이기 때문에 뒤로가기 버튼을 터치하면 앱을 종료 한다.
//	 */
	@Override
	public void onBackPressed() {
		// TODO Auto-generated method stub
		Intent intent = new Intent(returnThis(), SendMeSettingsActivity.class);
		startActivity(intent);
		
		// 화면을 닫는다.
		sendMeActivityManager.removeActivity(SendMeSubSettingsProfileActivity.this);
		finish();
	}
//	
//	/**
//	 * 뒤로가기 버튼을 터치하면 alert 창을 띄우고 앱을 종료한다.
//	 */
//	private void showDialogSystemExit() {
//		new AlertDialog.Builder(SendMeSubSettingsProfileActivity.this)
//		.setTitle("프로그램 종료")
//		.setMessage("SendMe 를 종료하시겠습니까?")
//		.setNegativeButton("취소", new DialogInterface.OnClickListener() {
//
//			@Override
//			public void onClick(DialogInterface dialog, int which) {
//
//			}
//		})
//		.setPositiveButton("확인", new DialogInterface.OnClickListener() {
//			
//			@Override
//			public void onClick(DialogInterface dialog, int which) {
//				// TODO Auto-generated method stub
//				sendMeActivityManager.finishAllActivity();
//			}
//		}).show();
//	}
	
	///////////////////////////////////////////////////////////////////////////////////////////////////////////////////
	// 사용자 알림
//	/**
//	 * 승인에 실패했다는 dialog 를 띄운다.
//	 */
//	private void showDialogFailToAdmission() {
//		new AlertDialog.Builder(SendMeSubSettingsProfileActivity.this)
//		.setTitle("휴대전화번호 승인")
//		.setMessage("승인에 실패했습니다.\n인증번호를 다시 요청하고 승인신청을 하시기 바랍니다.")
//		.setNegativeButton("확인", new DialogInterface.OnClickListener() {
//
//			@Override
//			public void onClick(DialogInterface dialog, int which) {
//
//			}
//		}).show();
//	}
//	
//	/**
//	 * 멤버 가입에 실패했다는 dialog 를 띄운다.
//	 */
//	private void showDialogFailToRegisterMember() {
//		new AlertDialog.Builder(SendMeSubSettingsProfileActivity.this)
//		.setTitle("SendMe 멤버 등록")
//		.setMessage("멤버 등록에 실패했습니다.\n인증번호를 다시 요청하고 승인신청을 하시기 바랍니다.")
//		.setNegativeButton("확인", new DialogInterface.OnClickListener() {
//
//			@Override
//			public void onClick(DialogInterface dialog, int which) {
//
//			}
//		}).show();
//	}

//	/**
//	 * 화면 가운데 SMS 로 인증번호가 발송되었다는 toast 를 띄운다.
//	 */
//	public void showToastSendSMS() {
//		CharSequence text = "SMS 로 인증번호가 발송되었습니다.";
//		Toast toast = Toast.makeText(getApplicationContext(), text, Toast.LENGTH_SHORT);
//		toast.setGravity(Gravity.CENTER_VERTICAL|Gravity.CENTER_HORIZONTAL, 0, 0);
//		toast.show();
//	}
	
	
	/**
	 * 이미 사용중인 닉네임 toast 를 띄운다
	 */
	public void showToastAlreadyExistNickName() {
		CharSequence text = "이미 사용중인 닉네임입니다.";
		Toast toast = Toast.makeText(getApplicationContext(), text, Toast.LENGTH_SHORT);
		toast.setGravity(Gravity.CENTER_VERTICAL|Gravity.CENTER_HORIZONTAL, 0, 0);
		toast.show();
	}
	
	/**
	 * 정보 저장에 성공했다는 toast 를 띄운다.
	 */
	public void showToastSuccessSaveInfo() {
		CharSequence text = "변경사항이 저장되었습니다.";
		Toast toast = Toast.makeText(getApplicationContext(), text, Toast.LENGTH_SHORT);
		toast.setGravity(Gravity.CENTER_VERTICAL|Gravity.CENTER_HORIZONTAL, 0, 0);
		toast.show();
	}
	/**
	 * 정보 저장에 실패했다는 toast 를 띄운다.
	 */
	public void showToastFailSaveInfo() {
		CharSequence text = "저장이 실패했습니다.";
		Toast toast = Toast.makeText(getApplicationContext(), text, Toast.LENGTH_SHORT);
		toast.setGravity(Gravity.CENTER_VERTICAL|Gravity.CENTER_HORIZONTAL, 0, 0);
		toast.show();
	}
	//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
	// preference 
	/**
	 * SharedPreference 정보를 확인 한다.
	 */
	public void selectPreferenceProfileData() {
		SharedPreferences mSharedPreference = getSharedPreferences(SendMeConstant.SENDME_PREFERENCE, Activity.MODE_PRIVATE);
		
		
		PHONE_NUMBER = mSharedPreference.getString("phone_number", "");
		profileUserName =  mSharedPreference.getString("profile_user_name", "");
		Log.i(TAG, "profileUserName : " + profileUserName);
	}
	/**
	 * 사용자 이름을 설정파일에 저장한다
	 */
	public void savePreferenceProfileData() {
		try{
			SharedPreferences sharedPreferences = getSharedPreferences(SendMeConstant.SENDME_PREFERENCE, Activity.MODE_PRIVATE);
			SharedPreferences.Editor editor = sharedPreferences.edit();
			editor.putString("profile_user_name", profileUserName);
			editor.commit();
		}catch(Exception e){
			mHandler.sendMessage(mHandler.obtainMessage(THREAD_FAIL_SAVE_INFO));
		}
		
	}
	

}
